package handler

import (
	"net/http"
	"src/protoMsg"
	"src/server/Login/logindbmanager"
	"src/zeus/logger"

	"github.com/gin-gonic/gin"
)

// 收到注册请求
func OnRegisterReq(c *gin.Context) {
	var errcode protoMsg.ErrorCode = protoMsg.ErrorCode_EC_Default
	defer func() {
		if errcode == protoMsg.ErrorCode_EC_Default {
			return
		}
		logger.Warn("OnLoginReq Error:", errcode)
		c.JSON(http.StatusOK, gin.H{"Result": errcode})
	}()

	msg := &protoMsg.RegisterReq{}
	err1 := c.ShouldBindJSON(msg)
	if err1 != nil {
		errcode = protoMsg.ErrorCode_EC_MsgUnPackFail
		return
	}
	// 检查帐号是否存在
	userMd, ok := logindbmanager.GetInst().QueryUserAccountWithoutPWD(msg.UserName)
	if ok {
		errcode = protoMsg.ErrorCode_EC_UserExisted
		// 返回登录
		return
	}
	//
	userMd, ok = logindbmanager.GetInst().NewUserAccount(msg.UserName, msg.PassWord)
	if !ok {
		return
	}
	var uid uint64 = userMd.UID
	ret := protoMsg.RegisterRet{}
	c.JSON(http.StatusOK, ret)

	logger.Debug(logger.LogKey_LoginFlow, "登录成功 UserName: ", msg.UserName, " PassWord: ", msg.PassWord, " uid: ", uid)

}

// 收到登录请求
func OnLoginReq(c *gin.Context) {
	var errcode protoMsg.ErrorCode = protoMsg.ErrorCode_EC_Default
	defer func() {
		if errcode == protoMsg.ErrorCode_EC_Default {
			return
		}
		logger.Warn("OnLoginReq Error:", errcode)
		c.JSON(http.StatusOK, gin.H{"Result": errcode})

	}()

	msg := &protoMsg.LoginReq{}
	err1 := c.ShouldBindJSON(msg)
	if err1 != nil {
		errcode = protoMsg.ErrorCode_EC_MsgUnPackFail
		return
	}
	// 检查帐号是否存在
	userMd, ok := logindbmanager.GetInst().QueryUserAccount(msg.UserName, msg.PassWord)
	if !ok {
		errcode = protoMsg.ErrorCode_EC_UserNotExist
		// 失败,重新注册
		return
	}

	var uid uint64 = userMd.UID

	ret := protoMsg.LoginRet{
		UID: uid,
	}
	c.JSON(http.StatusOK, ret)

	logger.Debug(logger.LogKey_LoginFlow, "登录成功 UserName: ", msg.UserName, " PassWord: ", msg.PassWord, " uid: ", uid)

}

// // srvGroupHandler 获取服务器列表
// func srvGroupHandler(c *gin.Context) {
// 	ret := logindbmanager.GetInst().GetUserGroupListAckByCache()
// 	// 客户端刷新太频繁,所以屏蔽日志
// 	//logger.Debug(logger.LogKey_LoginFlow, "[handler] srvGroupHandler 登录流程 获取服务器列表 客户端ip: ", c.ClientIP())
// 	c.JSON(http.StatusOK, ret)
// }

// func userLoginNewHandler(c *gin.Context) {
// }

// /*
// 游卡的登录
// */
// func youkaLoginHandler(c *gin.Context) {
// 	var err error
// 	defer func() {
// 		if err != nil {
// 			logger.Warn(err)
// 			if v, ok := err.(*common.Error); ok {
// 				c.JSON(http.StatusOK, gin.H{"Result": v.ErrCode})
// 			} else {
// 				c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_Tips_Param_Fail})
// 			}
// 		}
// 	}()
// 	msg := &protoMsg.YoukaLoginReq{}
// 	err = c.ShouldBindJSON(msg)
// 	if err != nil {
// 		return
// 	}

// 	signSrc := fmt.Sprintf("%s%s%s%s%s", msg.TopUserID, msg.TopUserName, msg.SdkUserID, msg.Token, gcommon.GetCfgInst().SDKyouka.AppSecret)
// 	sig := fmt.Sprintf("%x", md5.Sum([]byte(signSrc)))
// 	if sig != msg.Sign {
// 		//失败
// 		err = gcommon.Err_User_Sign_Fail
// 		return
// 	}
// 	//成功
// 	// 检查帐号是否存在
// 	userMd, isNew := logindbmanager.GetInst().QueryCreateUser(msg.TopUserName, msg.ChannelID)
// 	if userMd.UserID == 0 {
// 		err = gcommon.Err_User_Create_Fail
// 		return
// 	} else if isNew {
// 		//新建游戏账号 非SDK账号注册,所以记录无意义
// 	}
// 	var uid uint64 = userMd.UserID
// 	device := &dbservice.DeviceInfo{
// 		Values: url.Values{},
// 	}
// 	for k, v := range msg.Device.DeviceInfo {
// 		device.Values.Set(k, v)
// 	}
// 	device.SetDeviceId(msg.DeviceID)
// 	device.SetDeviceName(msg.DeviceName)
// 	device.SetOS(msg.OS)
// 	device.SetAppVer(msg.ClientVer)
// 	device.SetPlatformID(msg.PlatformID)
// 	device.SetChannelID(msg.ChannelID)
// 	//写入设备信息缓存
// 	util := dbservice.LoginPidUtil(uid)
// 	//dbservice.GetLoginUtil(umd.UserID)
// 	util.SetDeviceInfo(device)

// 	arli := strings.Split(msg.Extension, "|") //扩展字段 0:  1:  2:是否成年 3:  4:
// 	// 是否成年
// 	isadult := true
// 	if len(arli) >= 5 {
// 		isadult = arli[2] == "1"
// 	}
// 	//判断是否成年，都防沉谜逻辑
// 	if !isadult {
// 		//不是成年
// 		n := time.Now()
// 		if n.Hour() != 20 {
// 			err = gcommon.Err_User_Not_Adult
// 			return
// 			// gcommon.TickUserNtfBySess(sess, gcommon.Err_User_Not_Adult)
// 			// sess.Close()
// 			// return
// 		}
// 	}
// 	//生成本地的Sign
// 	timestamp := time.Now().Unix()
// 	sig = symbol.CreateSig(uid, timestamp, msg.ChannelID, isadult)

// 	ret := protoMsg.UserLoginRet{
// 		UID:         uid,
// 		TS:          fmt.Sprintf("%d", timestamp),
// 		IsAdult:     isadult,
// 		Result:      0,
// 		ResultMsg:   "",
// 		AccessToken: sig,
// 	}
// 	c.JSON(http.StatusOK, ret)

// }

// /*
// 游卡的登录 新版SDK,上面的后续会废弃掉.
// */
// func youkaLoginNewHandler(c *gin.Context) {
// 	var err error
// 	defer func() {
// 		if err != nil {
// 			logger.Warn(err)
// 			if v, ok := err.(*common.Error); ok {
// 				c.JSON(http.StatusOK, gin.H{"Result": v.ErrCode})
// 			} else {
// 				c.JSON(http.StatusOK, gin.H{"Result": gcommon.RETMSG_Tips_Param_Fail})
// 			}
// 		}
// 	}()
// 	msg := &protoMsg.YoukaLoginNewReq{}
// 	err = c.ShouldBindJSON(msg)
// 	if err != nil {
// 		logger.Warn("无法解析传入参数")
// 		//c.AbortWithError(401, err)
// 		return
// 	}
// 	logger.Debug(logger.LogKey_LoginFlow, "LoginReq=", msg)
// 	type YokaLoginDataType struct {
// 		GSSDKUserID    string `json:"userId"`         //OpenId 		like:1001_210163385571
// 		GSSDKUserName  string `json:"userName"`       //			like: 210163385571
// 		GSSDKUserNick  string `json:"userNick"`       //昵称 		like:ykac010400161
// 		RealNameStatus int32  `json:"realNameStatus"` //实名状态  0否 1是
// 		IsAdult        int32  `json:"isAdult"`        //实名: 是否成年人 0否 1是
// 		IsGuest        int32  `json:"isGuest"`        //是否是游客 0否 1是
// 		Extension      string `json:"extension"`      //透传信息
// 		Sign           string `json:"sign"`           //其他参数的是否被修改的签名认证 like:"cdf5038f6b3b57a4ae0ace4004d11d3f"
// 		AppId          string `json:"appId"`          //产品appId 服务器会校验是否一致 like:"10000xxxxxxx"
// 		ChannelID      string `json:"channelId"`      //渠道ID
// 		UserAge        int32  `json:"userAge"`        //实名年龄

// 		*protoMsg.YoukaLoginNewReq
// 	}

// 	params := map[string]interface{}{}
// 	err = json.Unmarshal([]byte(msg.LoginData), &params)
// 	if err != nil {
// 		logger.Warn("无法解析传入参数 LoginData:", msg.LoginData, " ", err)
// 		return
// 	}
// 	var loginData YokaLoginDataType
// 	loginData.GSSDKUserID = mustString(params["userId"])
// 	loginData.GSSDKUserName = mustString(params["userName"])
// 	loginData.GSSDKUserNick = mustString(params["userNick"])
// 	loginData.RealNameStatus = mustInt32(params["realNameStatus"])
// 	loginData.IsAdult = mustInt32(params["isAdult"])
// 	loginData.IsGuest = mustInt32(params["isGuest"])
// 	loginData.Extension = mustString(params["extension"])
// 	loginData.Sign = mustString(params["sign"])
// 	loginData.AppId = mustString(params["appId"])
// 	loginData.ChannelID = mustString(params["channelId"])
// 	loginData.UserAge = mustInt32(params["userAge"])

// 	loginData.YoukaLoginNewReq = msg
// 	if logger.CheckKey(logger.LogKey_LoginFlow) {
// 		logger.Debug(logger.LogKey_LoginFlow, "LoginData  == params=", gcommon.ToJsonString(params), "   ,loginData=", gcommon.ToJsonString(loginData))
// 	}

// 	if loginData.AppId != gcommon.GetCfgInst().SDKyouka.APPID {
// 		logger.Warn("客户端请求的AppId 跟服务器不匹配:", loginData.AppId, gcommon.GetCfgInst().SDKyouka.APPID)
// 		//err = fmt.Errorf("请求参数AppId 不匹配")
// 		//c.AbortWithError(401, err)
// 		//return
// 	}

// 	if loginData.Device == nil {
// 		loginData.Device = &protoMsg.ClientDeviceInfo{}
// 	}
// 	//params["userId"] = loginData.GSSDKUserID              // GSSDK账号(账号格式：账号体系_渠道侧用户ID)，游戏侧在存储时，建议字段长度最少256位
// 	//params["userName"] = loginData.GSSDKUserName          // 渠道侧用户ID
// 	//params["userNick"] = loginData.GSSDKUserNick          // 渠道侧用户昵称
// 	//params["realnameStatus"] = loginData.RealNameStatus   // 渠道侧用户实名状态（不同渠道返回的值代表的含义不一致），以各个渠道为准
// 	//params["isAdult"] = loginData.IsAdult                 // 渠道侧用户成年状态。0：未成年、1：成年
// 	//params["isGuest"] = loginData.IsGuest                 // 是否为游客（弃用）；0：非游客、1：游客
// 	//params["extension"] = loginData.Extension             // 扩展字段（json字符串）
// 	//params["appId"] = gcommon.GetCfgInst().SDKyouka.APPID //
// 	//params["channelId"] = loginData.ChannelID             //
// 	//params["userAge"] = loginData.UserAge                 //

// 	//确保不是float类型, 字符串 比较靠谱;否则会出现 科学记数法 签名就会报错了.
// 	params["appId"] = loginData.AppId
// 	params["channelId"] = loginData.ChannelID
// 	signNew := CreateSign(params, gcommon.GetCfgInst().SDKyouka.AppSecret)
// 	if signNew != loginData.Sign {
// 		logger.Debug(logger.LogKey_LoginFlow, "签名不匹配, 请求签名为:", loginData.Sign, " , 本地计算的签名为:", signNew)
// 		err = gcommon.Err_User_Sign_Fail
// 		return
// 	}
// 	//成功
// 	// 检查帐号是否存在

// 	userMd, isNew := logindbmanager.GetInst().QueryCreateUser(loginData.GSSDKUserID, loginData.ChannelID)
// 	if userMd.UserID == 0 {
// 		err = gcommon.Err_User_Create_Fail
// 		return
// 	} else if isNew {
// 		//新建游戏账号 非SDK账号注册,所以记录无意义
// 	}
// 	var uid uint64 = userMd.UserID

// 	//one_id	          string	√	设备标识
// 	//device_id	        string	√	设备ID
// 	//app_package_name	string		APP包体名称
// 	//device_model	    string	√	设备型号
// 	//os_version	      string		操作系统版本
// 	//cpsid	            string	√	渠道分包ID
// 	//language	        string	√	语言
// 	//channel	          string	√	用户渠道
// 	//os_type	          string	√	操作系统
// 	//app_version	      string		APP版本（与客户端一致）
// 	//app_version_code	string		APP版本CODE（细分版本）
// 	//user_id	          string	√	GSSDK账号ID
// 	//yoka_id	          string	√	渠道侧用户ID
// 	//user_type	        string	√	账号类型\注册方式等(微信注册、手机注册、游客登录等)
// 	device := &dbservice.DeviceInfo{
// 		Values: url.Values{},
// 	}
// 	for k, v := range loginData.Device.DeviceInfo {
// 		device.Values.Set(k, v)
// 	}
// 	device.SetDeviceId(loginData.GetDevice().DeviceInfo["device_id"]) //make sure
// 	device.SetPlatformID(fmt.Sprint(loginData.PlatformID))
// 	//写入设备信息缓存
// 	util := dbservice.LoginPidUtil(uid)
// 	//dbservice.GetLoginUtil(umd.UserID)
// 	util.SetDeviceInfo(device)

// 	arli := strings.Split(loginData.Extension, "|") //扩展字段 0:  1:  2:是否成年 3:  4:
// 	// 是否成年
// 	isadult := true
// 	if len(arli) >= 5 {
// 		isadult = arli[2] == "1"
// 	}
// 	//判断是否成年，都防沉谜逻辑
// 	if !isadult {
// 		//不是成年
// 		n := time.Now()
// 		if n.Hour() != 20 {
// 			err = gcommon.Err_User_Not_Adult
// 			return
// 			// gcommon.TickUserNtfBySess(sess, gcommon.Err_User_Not_Adult)
// 			// sess.Close()
// 			// return
// 		}
// 	}
// 	//生成本地的Sign
// 	timestamp := time.Now().Unix()
// 	sig := symbol.CreateSig(uid, timestamp, loginData.ChannelID, isadult)

// 	ret := protoMsg.UserLoginRet{
// 		UID:         uid,
// 		TS:          fmt.Sprintf("%d", timestamp),
// 		IsAdult:     isadult,
// 		Result:      0,
// 		ResultMsg:   "",
// 		AccessToken: sig,
// 	}
// 	c.JSON(http.StatusOK, ret)
// }

// func mustString(in interface{}) string {
// 	switch tp := in.(type) {
// 	case string:
// 		return tp
// 	case float32:
// 		return strconv.FormatFloat(float64(tp), 'f', -1, 32)
// 	case float64:
// 		return strconv.FormatFloat(tp, 'f', -1, 64)
// 	case nil:
// 		return ""
// 	}
// 	return fmt.Sprint(in)
// }
// func mustInt32(in interface{}) int32 {
// 	switch tp := in.(type) {
// 	case string:
// 		return gcommon.StringToInt32(tp)
// 	case nil:
// 		return 0
// 	case bool:
// 		if tp {
// 			return 1
// 		}
// 		return 0
// 	case int:
// 		return int32(tp)
// 	case uint:
// 		return int32(tp)
// 	case int8:
// 		return int32(tp)
// 	case uint8:
// 		return int32(tp)
// 	case int32:
// 		return int32(tp)
// 	case uint32:
// 		return int32(tp)
// 	case int16:
// 		return int32(tp)
// 	case uint16:
// 		return int32(tp)
// 	case int64:
// 		return int32(tp)
// 	case uint64:
// 		return int32(tp)
// 	case float32:
// 		return int32(tp)
// 	case float64:
// 		return int32(tp)
// 	}
// 	return gcommon.StringToInt32(fmt.Sprint(in))
// }
